#include<iostream>
using namespace std;

//   virtual void Boil()表示纯序函数;=0为抽象类.
class AbstructDriking
{
    public:
        // 1.煮水
        virtual void Boil() = 0; 
        // 2.冲泡
        virtual void Brew() = 0;
        // 3.倒入杯中
        virtual void PourInCup() = 0;
        // 4.加入辅助料
        virtual void PutSomething() = 0;

        // 制作饮料
        void MakeDriking()
        {
            Boil();
            Brew();
            PourInCup();
            PutSomething();
        }
         
};

class Coffe :public AbstructDriking
{
    public:
        // 1.煮水
         virtual void Boil() 
         {
            cout<<"开始煮水!"<<endl;
         }
        // 2.冲泡
        virtual void Brew() 
        {
            {
            cout<<"开始冲泡咖啡!"<<endl;
         }
        }
        // 3.倒入杯中
        virtual void PourInCup() 
        {
            cout<<"开始倒入杯中!"<<endl;
         }
        // 4.加入辅助料
        virtual void PutSomething()
        {
            cout<<"开始加入牛奶和白糖!"<<endl;
         }
};


class Tea :public AbstructDriking
{
    public:
        // 1.煮水
         virtual void Boil() 
         {
            cout<<"开始煮水!"<<endl;
         }
        // 2.冲泡
        virtual void Brew() 
        {
            {
            cout<<"开始冲泡铁观音!"<<endl;
         }
        }
        // 3.倒入杯中
        virtual void PourInCup() 
        {
            cout<<"开始倒入杯中!"<<endl;
         }
        // 4.加入辅助料
        virtual void PutSomething()
        {
            cout<<"开始加入枸杞和菊花!"<<endl;
         }
};

void doWork(AbstructDriking * abs)
{
    abs->MakeDriking();
    // 释放堆区内存
    delete abs;
}


void test01()
{
    // 使用 new 为 C++ 类对象分配内存时，将在分配内存后调用对象的构造函数。
    // 使用 delete 运算符解除由 new 运算符分配的内存。 使用 delete运算符删除由 new 运算符分配的内存。
    doWork(new Coffe);
    cout<<"--------------------------------------------------------"<<endl;
    doWork(new Tea);
}

int main02(int argc, char const *argv[])
{
    test01();
    return 0;
}
